﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

// 1 前台线程 ：只有所有前台线程关闭完，才能完成程序关闭
// 2 后台线程 ：只要所有前台线程结束，后台线程会自动结束
// 3 使用Thread创建的线程默认是前台线程,前台线程不结束，整个进程就不会结束
// 4 当我们关闭主线程（附带关闭其它前台线程）后，正常情况下，后台线程会自动关闭，如果这个时候，
// 后台线程因为一些原因没能关闭或者说延时关闭，并会访问已关闭的前台线程资源，就会导致不可预料的
// 后果，所以我们会去form1主线程关闭中,先去判断进程是否为空，再去手动关闭我们自己创建的后台线程
// 5 thread.Abort执行了后，是没有办法重新Start的

namespace 线程
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Thread th;
        private void button1_Click(object sender, EventArgs e)
        {

            th = new Thread(this.test);
            th.IsBackground = true;
            th.Name = "计数器";
            th.Start();

            
        }
        private void test()
        {
            for (int i = 0; i < 10; i++)
            {
                textBox1.Text = i.ToString();
            }

            textBox1.Text = Thread.CurrentThread.Name;           
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.WordWrap = true;
            Control.CheckForIllegalCrossThreadCalls = false;
            Thread.CurrentThread.Name = "主线程";
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (th != null)
            {
                th.Abort();
            }
                       
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = Thread.CurrentThread.Name;
        }    
    }
}
